#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int data[32];
    int pos;
    int max;
    int len;
} array_t;

array_t *array_init(array_t *arr, int size)
{
    arr->pos = 0;
    arr->max = size;
    arr->len = 0;
    memset(arr->data, 0, 32);
    return arr;
}

array_t *array_add(array_t *arr, int a)
{
    if (arr) {
        if (arr->pos < arr->max - 1) {
            arr->data[arr->pos] = a;
            arr->pos++;
            arr->len++;
        }
    }
    return arr;
}

typedef int (*array_func_t )(int);

void array_foreach(array_t *arr, int idx, array_func_t func)
{
    if (arr) {
        func(arr->data[idx]);
        if (idx < arr->len - 1) {
            array_foreach(arr, idx + 1, func);
        }
    }
}

int print_int(int num)
{
    printf("%d\n", num);
}

void array_add_seq(array_t *arr, int start, int end)
{
    if (arr) {
        array_add(arr, start);
        if (start < end) {
            array_add_seq(arr, start + 1, end);
        }
    }
}

array_t *array_add_midle(array_t *arr)
{
    return array_add(array_add(array_add(arr,1),2),3);
}

array_t *array_add_midle2(array_t *arr)
{
    array_add_seq(arr, 1, 20);
    return arr;
}

int main()
{
    array_t arr;
    array_foreach(array_add_midle(array_init(&arr, 32)), 0, print_int);
    array_t arr2;
    array_foreach(array_add_midle2(array_init(&arr2, 32)), 0, print_int);

    return 0;
}
